#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>

void SIGCHLD_handler(int signo)
{
    while (true)
    {
        pid_t rid = waitpid(-1, nullptr, WNOHANG);
        //-1表示回收任意一个结束的子进程，WNOHANG表示非阻塞等待
        if (rid > 0)
        {
            std::cout << "回收成功 回收的子进程为：pid[" << rid << ']' << std::endl;
        }
        else if (rid == 0) // 如果当前没有处于僵尸状态的子进程，waipid的返回值为0
        {
            std::cout << "没有要回收的子进程" << std::endl;
            break;
        }
        else if (rid == -1)
        {
            std::cout << "回收工作出现错误" << std::endl;
            break;
        }
    }
}

int main()
{
    signal(SIGCHLD, SIGCHLD_handler);
    for (int i = 0; i < 10; i++)
    {
        if (fork() == 0)
        {
            // 子进程运行
            sleep(3);
            std::cout << "pid[" << getpid() << "] is exit" << std::endl;
            exit(0);
        }
    }

    // 父进程运行
    while (true)
    {
        sleep(1);
    }
    return 0;
}